﻿#define _CRT_SECURE_NO_WARNINGS 1
/*--- 预定义符号 ---*/
/*
	__FILE__   //进行编译的源文件
	__LINE__   //文件当前的行号
	__DATE__   //文件被编译的日期
	__TIME__   //文件被编译的时间
	__STDC__   //如果编译器遵循ANSI C，其值为1，否则未定义
*/
//#include <stdio.h>
//int main()
//{
//	printf("%s\n", __FILE__);
//	printf("%d\n", __LINE__);
//	printf("%s\n", __DATE__);
//	printf("%s\n", __TIME__);
//
//	printf("%d\n", __STDC__);
//	//因为VS不支持ANSI C的，其实 __STDC__ 未定义
//	//gcc是支持的
//	return 0;
//}

/*-------------------------------------------------*/

/*--- #define ---*/
/*
	1.#define 定义标识符常量 --- 无参数
	2.#define 定义宏   --- 有参数
*/
//#define MAX 100
//#define reg register
//#define STR "hehe"
//#include <stdio.h>
//int main()
//{
//	int m = MAX;
//	reg int n = 100;
//	printf("%d\n", m);
//
//	printf("%s\n", STR);
//	return 0;
//}
//在定义 #define 时 要不要加； 不要加


/*-------------------*/
//#include <stdio.h>
//#define ptr_t int*
//typedef int* ptr_t2;
//int main()
//{
//	ptr_t p1, p2;
//	//在预处理之后 被替换为 int *p1, p2;----p1是指针 p2是整形
//	ptr_t2 p3, p4;//p3 p4都是指针类型
//	return 0;
//}

/*-------------------*/

/* # 和 ## */
/*
	使用 # ，把一个宏参数变成对应的字符串
	##可以把位于它两边的符号合成一个符号。
*/

//#include <stdio.h>
/* \ --- 续航符 */
//#define MALLOC(num,type) \
//		(type*)malloc(num*sizeof(type))
//int main()
//{
//	//宏有时候可以做函数做不到的事情。比如：宏的参数可以出现类型，但是函数做不到。
//	int* p = MALLOC(100, int);
//	//替换为：int* p = (int*)malloc(100 * sizeof(int));
//	return 0;
//}

/*--------------------------*/
/*--- #undef ---*/
//#include <stdio.h>
//#define MAX 10
//int main()
//{
//	int m = MAX;
//#undef MAX//这条指令用于移除一个宏定义
//	int n = MAX;//err
//	return 0;
//}

/*--------------------------*/
/*--- 条件编译 ---*/
//满足条件代码就参与编译，不满足条件，代码就不参与编译
/*
常见的条件编译指令：
	1.
		#if 常量表达式
			//...
		#endif

	2.多个分支的条件编译
		#if 常量表达式
		//...
		#elif 常量表达式
		//...
		#else
		//...
		#endif

	3.判断是否被定义（和定义的值无关）
		#if defined(symbol)
		#ifdef symbol

		#if !defined(symbol)
		#ifndef symbol

		4.嵌套指令
		#if defined(OS_UNIX)
			#ifdef OPTION1
				unix_version_option1();
			#endif
			#ifdef OPTION2
				unix_version_option2();
			#endif
		#elif defined(OS_MSDOS)
			#ifdef OPTION2
				msdos_version_option2();
			#endif
		#endif


*/
#include <stdio.h>
//1
//int main()
//{
//	//if 后为真参与编译
//#if 1
//	printf("hehe\n");
//#endif
//	//if 后为假参与编译
//#if 0
//	printf("hehe\n");
//#endif
//	return 0;
//}

//2
//#define M 10
//int main()
//{
//#if M==100
//	printf("hehe\n");
//#elif M==100
//	printf("hehehe\n");
//#else
//	printf("haha\n");
//#endif
//	return 0;
//}

/*-----------*/
/*预处理指令*/
/*
	1.#define
	2.#include
	3.#if
	4.#undef
	5.#ifdef
	6.#ifndef
	7.#pragma
*/